﻿using System;
using System.Collections.Generic;
using System.Linq;
using NHibernate.Linq;
using Sebrae.Academico.InfraEstrutura.Core;
using Sebrae.Academico.InfraEstrutura.Core.UnitOfWork;
using Sebrae.Academico.Trilhas.Dominio.Classes;

namespace Sebrae.Academico.Trilhas.BM.Classes
{
    public class BMTrilhaTopicoTematico : BusinessManagerBase
    {
        #region Atributos

        private RepositorioBase<TrilhaTopicoTematico> repositorio = null;

        #endregion

        #region Construtor

        public BMTrilhaTopicoTematico(IUnitOfWork unitOfWork)
        {
            repositorio = new RepositorioBase<TrilhaTopicoTematico>(unitOfWork);
        }
        
        #endregion

        public void Incluir(TrilhaTopicoTematico pTrilhaTopicoTematico)
        {
            repositorio.Salvar(pTrilhaTopicoTematico);
        }

        public void Alterar(TrilhaTopicoTematico pTrilhaTopicoTematico)
        {
            repositorio.Salvar(pTrilhaTopicoTematico);
        }

        public IList<TrilhaTopicoTematico> ObterTodos()
        {
            return repositorio.ObterTodos();
        }

        public TrilhaTopicoTematico ObterPorID(int pId)
        {
            return repositorio.ObterPorID(pId);
        }

        /// <summary>
        /// Validação das informações de um Tópico Temático.
        /// </summary>
        /// <param name="pItemTrilha"></param>
        public void ValidarTrilhaTopicoTematicoInformado(TrilhaTopicoTematico pTrilhaTopicoTematico)
        {
            ValidarInstancia(pTrilhaTopicoTematico);

            if (string.IsNullOrWhiteSpace(pTrilhaTopicoTematico.Nome)) throw new Exception("Informe o Nome. Campo Obrigatório");

            if (string.IsNullOrWhiteSpace(pTrilhaTopicoTematico.DescricaoTextoEnvio)) throw new Exception("Descrição do Texto de Envio. Campo Obrigatório");
        }


        public void ExcluirTrilhaTopicoTematico(TrilhaTopicoTematico pTrilhaTopicoTematico)
        {
            if (this.ValidarDependencias(pTrilhaTopicoTematico))
                throw new Exception("Exclusão de registro negada. Existem Regisros Dependentes deste Tópico.");

            repositorio.Excluir(pTrilhaTopicoTematico);

        }

        public IList<TrilhaTopicoTematico> ObterTrilhaTopicoTematicoPorNome(string pNome)
        {
            return repositorio.GetByProperty("Nome", pNome);
        }

        protected override bool ValidarDependencias(object pTrilhaTopicoTematico)
        {
            TrilhaTopicoTematico trilhaTopicoTematico = (TrilhaTopicoTematico)pTrilhaTopicoTematico;

            return ((trilhaTopicoTematico.ListaItemTrilha != null && trilhaTopicoTematico.ListaItemTrilha.Count > 0) ||
                    (trilhaTopicoTematico.ListaTrilhaAtividadeInformativaParticipacao != null && trilhaTopicoTematico.ListaTrilhaAtividadeInformativaParticipacao.Count > 0));
        }
        
        public IList<TrilhaTopicoTematico> ObterPorFiltro(TrilhaTopicoTematico ptrilhaTopicoTematico)
        {
            var query = repositorio.Session.Query<TrilhaTopicoTematico>();

            if (ptrilhaTopicoTematico != null)
            {
                if (!string.IsNullOrWhiteSpace(ptrilhaTopicoTematico.Nome))
                    query = query.Where(x => x.Nome.Contains(ptrilhaTopicoTematico.Nome));
            }

            return query.ToList<TrilhaTopicoTematico>();
        }
    }
}
